home *** CD-ROM | disk | FTP | other *** search
/ Game Cracker (Expanded Edition) / Game Cracker (Expanded Edition).iso / cracks / SV_LBRNX.ZIP / Last Bronx.txt < prev    next >
Encoding:
Text File  |  1998-04-24  |  12.0 KB  |  237 lines

  1.  
  2. Free Information Xchange '98 presents:
  3.  
  4. Last Bronx - CD crack by Static Vengeance
  5.  
  6. Requirements:
  7. hex editor and full install
  8.  
  9.     Alright, I wrote up another tutorial on CD check cracking.  This time the game is Last Bronx,
  10. a new fighter game (with weapons) from Sega Entertainment.  The game plays well, however it needs a
  11. few modifications.  First it needs a patch to support the current crop of 3D accelerators.  Next, Sega
  12. could change some of the Japanese stuff, like the writting on signs and the voice wavs of the fighters
  13. to English, that would be nice then I could understand what they're saying at the end of each fight.
  14. And the most needed "FiX" is the removal of the CD check.  While I cannot reprogram the game or change
  15. the wav files to english, I can show you how to FiX the CD check in this program.
  16.     As with my other tutorials on CD checks I will be using W32Dasm to disassemble and crack this new
  17. fighter game.  If you want to follow along then load up W32Dasm and disassemble lb.exe from the directory
  18. you installed it to.  One of the first things you might want to do, is to run the game without the CD.
  19. This will tell you how the game asks for the original CD.  Or the easier method is going up to the menu
  20. bar and select "Refs" and then select "String data references" from the drop down menu (you knew I was
  21. going to say that, right?).  From there I just look for the string "Insert.." or "Please insert.." or
  22. something along those lines.  Grabbing the slider bar from the string refs box and scrolling down will, in
  23. many cases, lead you to the string used in the CD check.  For the Last Bronx you'll find the string "Please
  24. insert the LAST BRONX CD."  From there double clicking it will put you in the middle of code that does the
  25. CD check.  That code looks like this:
  26.  
  27. * Referenced by a CALL at Address:
  28. |:004ADFA8                                                        <-- Where the call came from
  29. |
  30. :004AF470 81EC88020000            sub esp, 00000288
  31. :004AF476 8D842488000000          lea eax, dword ptr [esp+00000088]
  32. :004AF47D 53                      push ebx
  33. :004AF47E 55                      push ebp
  34. :004AF47F 56                      push esi
  35. :004AF480 57                      push edi
  36. :004AF481 50                      push eax
  37. :004AF482 6800010000              push 00000100
  38.  
  39. * Reference To: KERNEL32.GetLogicalDriveStringsA, Ord:00F8h   <-- String that's often used in CD checks
  40.                                   |
  41. :004AF487 FF157CB04D00            Call dword ptr [004DB07C]
  42. :004AF48D 85C0                    test eax, eax
  43. :004AF48F 7510                    jne 004AF4A1                <-- Must take this jump to perform check
  44. :004AF491 B801000000              mov eax, 00000001           <-- Or else load eax for a failed check
  45. :004AF496 5F                      pop edi
  46. :004AF497 5E                      pop esi
  47. :004AF498 5D                      pop ebp
  48. :004AF499 5B                      pop ebx
  49. :004AF49A 81C488020000            add esp, 00000288
  50. :004AF4A0 C3                      ret                         <-- Return to caller with eax containing result
  51.  
  52. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  53. |:004AF48F(C)
  54. |
  55. * Reference To: KERNEL32.OpenFile, Ord:01AFh                  <-- Trying to open specific file on CD
  56.                                   |
  57. :004AF4A1 8B1DA0B04D00            mov ebx, dword ptr [004DB0A0]
  58.  
  59. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  60. |:004AF57F(C)
  61. |
  62. :004AF4A7 8A842498000000          mov al, byte ptr [esp+00000098]
  63. :004AF4AE 8DAC2498000000          lea ebp, dword ptr [esp+00000098]
  64. :004AF4B5 84C0                    test al, al
  65. :004AF4B7 0F84AB000000            je 004AF568                 <-- Jump to "Insert ... CD" section
  66.  
  67. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  68. |:004AF562(C)
  69. |
  70. :004AF4BD 55                      push ebp
  71.  
  72. * Reference To: KERNEL32.GetDriveTypeA, Ord:00DFh                  <-- Common string in CD check routines
  73.                                   |
  74. :004AF4BE FF1580B04D00            Call dword ptr [004DB080]
  75. :004AF4C4 83F805                  cmp eax, 00000005                <-- 05 is the CD-ROM value
  76. :004AF4C7 0F8581000000            jne 004AF54E                     <-- If NO CD-ROM then take this jump
  77. :004AF4CD 8BFD                    mov edi, ebp
  78. :004AF4CF 83C9FF                  or ecx, FFFFFFFF
  79. :004AF4D2 33C0                    xor eax, eax
  80.  
  81.  -- CLIP uninformative code (compares, shr's & and's ect) --
  82.  
  83. :004AF542 C644241C88              mov [esp+1C], 88
  84. :004AF547 FFD3                    call ebx
  85. :004AF549 83F8FF                  cmp eax, FFFFFFFF
  86. :004AF54C 7547                    jne 004AF595                   <-- Taking this jump means check passed
  87.  
  88. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  89. |:004AF4C7(C)
  90. |
  91. :004AF54E 807D0000                cmp byte ptr [ebp+00], 00
  92. :004AF552 7408                    je 004AF55C
  93.  
  94. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  95. |:004AF55A(C)
  96. |
  97. :004AF554 8A4501                  mov al, byte ptr [ebp+01]
  98. :004AF557 45                      inc ebp
  99. :004AF558 84C0                    test al, al
  100. :004AF55A 75F8                    jne 004AF554
  101.  
  102. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  103. |:004AF552(C)
  104. |
  105. :004AF55C 8A4501                  mov al, byte ptr [ebp+01]
  106. :004AF55F 45                      inc ebp
  107. :004AF560 84C0                    test al, al
  108. :004AF562 0F8555FFFFFF            jne 004AF4BD                    <-- Jump up and start check over
  109.  
  110. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  111. |:004AF4B7(C)
  112. |
  113. :004AF568 6A35                    push 00000035
  114.  
  115. * Possible StringData Ref from Data Obj ->"Last Bronx"
  116.                                   |
  117. :004AF56A 680874B400              push 00B47408
  118.  
  119. * Possible StringData Ref from Data Obj ->"Please insert the LAST BRONX CD."  <-- The all important string
  120.                                   |
  121. :004AF56F 68F474B400              push 00B474F4
  122. :004AF574 6A00                    push 00000000
  123.  
  124. * Reference To: USER32.MessageBoxA, Ord:019Bh
  125.                                   |
  126. :004AF576 FF1534B24D00            Call dword ptr [004DB234]
  127. :004AF57C 83F802                  cmp eax, 00000002               <-- 00000002 in eax means you hit cancel
  128. :004AF57F 0F8522FFFFFF            jne 004AF4A7
  129. :004AF585 B801000000              mov eax, 00000001               <-- Check failed, load eax with 00000001
  130. :004AF58A 5F                      pop edi
  131. :004AF58B 5E                      pop esi
  132. :004AF58C 5D                      pop ebp
  133. :004AF58D 5B                      pop ebx
  134. :004AF58E 81C488020000            add esp, 00000288
  135. :004AF594 C3                      ret
  136.  
  137. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  138. |:004AF54C(C)
  139. |
  140. :004AF595 8BFD                    mov edi, ebp                   <-- If you got this far, then the CD is in
  141. :004AF597 83C9FF                  or ecx, FFFFFFFF               <-- your CD-ROM drive when this code was run
  142. :004AF59A 33C0                    xor eax, eax
  143. :004AF59C F2                      repnz
  144. :004AF59D AE                      scasb
  145. :004AF59E F7D1                    not ecx
  146. :004AF5A0 2BF9                    sub edi, ecx
  147. :004AF5A2 8BD1                    mov edx, ecx
  148. :004AF5A4 8BF7                    mov esi, edi
  149. :004AF5A6 BF309A6401              mov edi, 01649A30
  150. :004AF5AB C1E902                  shr ecx, 02
  151. :004AF5AE F3                      repz
  152. :004AF5AF A5                      movsd
  153. :004AF5B0 8BCA                    mov ecx, edx
  154. :004AF5B2 83E103                  and ecx, 00000003
  155. :004AF5B5 F3                      repz
  156. :004AF5B6 A4                      movsb
  157. :004AF5B7 BF309A6401              mov edi, 01649A30
  158. :004AF5BC 83C9FF                  or ecx, FFFFFFFF
  159. :004AF5BF F2                      repnz
  160. :004AF5C0 AE                      scasb
  161. :004AF5C1 A1EC74B400              mov eax, dword ptr [00B474EC]
  162. :004AF5C6 8A0DF074B400            mov cl, byte ptr [00B474F0]
  163. :004AF5CC 4F                      dec edi
  164. :004AF5CD 8907                    mov dword ptr [edi], eax
  165. :004AF5CF 33C0                    xor eax, eax                   <-- All important instruction that sets
  166. :004AF5D1 884F04                  mov byte ptr [edi+04], cl      <-- eax to zero for a passed CD check
  167. :004AF5D4 5F                      pop edi
  168. :004AF5D5 5E                      pop esi
  169. :004AF5D6 5D                      pop ebp
  170. :004AF5D7 5B                      pop ebx
  171. :004AF5D8 81C488020000            add esp, 00000288
  172. :004AF5DE C3                      ret
  173.  
  174.     That was most of the code that's responsible for checking for the original CD being present
  175. on your system.  So now lets check out the call to the CD check and the surounding code to see what
  176. it does and how we can disable the check:
  177.  
  178.  -- Program Code --
  179. :004ADF6B B801000000              mov eax, 00000001
  180. :004ADF70 A3E49C6401              mov dword ptr [01649CE4], eax
  181. :004ADF75 A3E89C6401              mov dword ptr [01649CE8], eax
  182. :004ADF7A A3E09C6401              mov dword ptr [01649CE0], eax
  183. :004ADF7F EB16                    jmp 004ADF97
  184.  
  185. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  186. |:004ADF66(C)
  187. |
  188. :004ADF81 892DE49C6401            mov dword ptr [01649CE4], ebp
  189. :004ADF87 892DE89C6401            mov dword ptr [01649CE8], ebp
  190. :004ADF8D C705E09C640101000000    mov dword ptr [01649CE0], 00000001
  191.  
  192. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  193. |:004ADF69(C), :004ADF7F(U)
  194. |
  195. :004ADF97 8B4C2460                mov ecx, dword ptr [esp+60]
  196. :004ADF9B E880FDFFFF              call 004ADD20
  197. :004ADFA0 392D2C74B400            cmp dword ptr [00B4742C], ebp    <-- See if we already "know" the CD is there
  198. :004ADFA6 740D                    je 004ADFB5                      <-- Take this jump if it's been found once
  199. :004ADFA8 E8C3140000              call 004AF470                    <-- Else, do the CD check for the first time
  200. :004ADFAD 85C0                    test eax, eax                    <-- eax is 00 for passed check
  201. :004ADFAF 0F85B5080000            jne 004AE86A                     <-- On fail eax is 01 and this jump is taken
  202.  
  203. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  204. |:004ADFA6(C)
  205. |
  206. * Reference To: USER32.GetSystemMetrics, Ord:012Ch                 <-- Jumping or falling through will contiune
  207.                                   |                                <-- With the game, which is what we want!
  208. :004ADFB5 8B3508B24D00            mov esi, dword ptr [004DB208]
  209. :004ADFBB 55                      push ebp
  210. :004ADFBC FFD6                    call esi
  211. :004ADFBE 6A01                    push 00000001
  212. :004ADFC0 A348B06401              mov dword ptr [0164B048], eax
  213. :004ADFC5 FFD6                    call esi
  214. :004ADFC7 6A68                    push 00000068
  215. :004ADFC9 53                      push ebx
  216. :004ADFCA A34CB06401              mov dword ptr [0164B04C], eax
  217. :004ADFCF 895C2444                mov dword ptr [esp+44], ebx
  218.  -- The rest of the program code --
  219.  
  220.     After checking this section of code it's quite simple to crack this one.  You see the program checks
  221. to see if the CD check has already been done (and passed of course).  If so, the program jumps over the call
  222. to the CD check and starts the game.  Otherwise the program falls through to the call to the CD check and makes
  223. sure you have the original CD on-line.  From here the crack should be straight forward and easy to see.  Just
  224. change the conditional jump (je 004ADFB5) at 4ADFA6 to a jump (jmp 004ADFB5) so the game will always run.  This
  225. way the CD check is never run and the game will always start right up.  Another or different edit would be to
  226. NOP out the call to the CD check routine (at 4ADFA8) and then NOP out the conditional jump (at 4ADFAF) to allow
  227. the code to fall through to the continue section of the game.  The actual edit to the file would be:
  228.  
  229. EDIT lb.exe at offset 709,542
  230. ================================
  231. Search for: 74 0D E8 C3 14 00 00
  232. Change to : EB -- -- -- -- -- --
  233.  
  234.     That's all that needs to be done to FiX the Last Bronx
  235.  
  236. Static Vengeance
  237.